package com.urbainski.estagio.negocio;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.urbainski.dao.UrbainskiDAO;
import com.urbainski.dao.bo.GenericBO;
import com.urbainski.estagio.constantes.Constantes;
import com.urbainski.estagio.entidade.Mensagem;
import com.urbainski.estagio.entidade.Usuario;

import flex.messaging.FlexContext;

public class MensagemBO extends GenericBO {

	
	/**
	 * @author Cristian Elder Urbainski
	 * @since 03/01/2012
	 */
	
	public List<Mensagem> buscarTodasMensagens() throws Exception {
		try {
			getUrbainskiDao().beginTras();
			
			Usuario usuarioLogado = (Usuario) FlexContext.getFlexSession().getAttribute(Constantes.USUARIO_LOGADO); 
			
			@SuppressWarnings("unchecked")
			List<Mensagem> listaMensagem = getUrbainskiDao().getSessao().createCriteria(Mensagem.class)
					.createAlias("emissor", "emissor", Criteria.LEFT_JOIN)
					.createAlias("receptor", "receptor", Criteria.LEFT_JOIN)
					.createAlias("emissor.professor", "emissor.professor", Criteria.LEFT_JOIN)
					.createAlias("receptor.professor", "receptor.professor", Criteria.LEFT_JOIN)
				.add(Restrictions.or(Restrictions.eq("idReceptor", usuarioLogado.getIdUsuario())
						, Restrictions.eq("idEmissor", usuarioLogado.getIdUsuario())))
						.addOrder(Order.desc("dtMensagem"))
						.list();
			
			for (Mensagem mensagem : listaMensagem) {
				if(mensagem.getEmissor().getProfessor() != null)
					mensagem.getEmissor().getProfessor().setEndereco(null);
				
				if(mensagem.getReceptor().getProfessor() != null)
					mensagem.getReceptor().getProfessor().setEndereco(null);
			}
			
			getUrbainskiDao().commitTrans();
			return listaMensagem;
		} catch (Exception e) {
			e.printStackTrace();
			getUrbainskiDao().rollbackTrans();
			throw e;
		}
	}
	
	
	public void salvarMensagem(Mensagem msg, List<Usuario> listaDestino) throws Exception {
		UrbainskiDAO dao = new UrbainskiDAO();
		
		try {
			dao.beginTras();
			
			Usuario usuarioLogado = (Usuario)FlexContext.getFlexSession().getAttribute(Constantes.USUARIO_LOGADO);
			msg.setIdEmissor(usuarioLogado.getIdUsuario());
			msg.setDtMensagem(new Date());
			
			for (Usuario usuario : listaDestino) {
				msg.setIdReceptor(usuario.getIdUsuario());
				
				dao.salvar(msg);
			}
			
			dao.commitTrans();
		} catch (Exception e) {
			e.printStackTrace();
			dao.rollbackTrans();
			throw e;
		}
	}

	
	public void alterarMensagem(Mensagem msg, List<Usuario> listaDestino) throws Exception {
		UrbainskiDAO dao = new UrbainskiDAO();
		
		try {
			dao.beginTras();

			msg.setTpSituacao(Constantes.TP_MSG_LIDA);
			
			for (Usuario usuario : listaDestino) {
				msg.setIdReceptor(usuario.getIdUsuario());
				
				dao.altualizar(msg);
			}
			
			dao.commitTrans();
		} catch (Exception e) {
			e.printStackTrace();
			dao.rollbackTrans();
			throw e;
		}
	}

	
}
